﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PoJun.Tools.DB.RDBMS
{
    /// <summary>
    /// DBHelper接口【同步】
    /// </summary>
    public interface IDBHelper
    {
        /// <summary>
        /// 执行增（INSERT）删（DELETE）改（UPDATE）语句。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <returns></returns>
        int ExecuteCommand(string sql);

        /// <summary>
        /// 执行增（INSERT）删（DELETE）改（UPDATE）语句。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="name">存储过程名称/或SQL语句</param>
        /// <param name="Type">类型</param>
        /// <param name="param">参数</param>
        /// <returns>int flag</returns>
        int ExecuteCommand(string name, CommandType Type, params Object[] param);

        /// <summary>
        /// 执行查询（SELECT）语句，第一行第一列的值。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <returns>int flag</returns>
        string GetScalar(string sql);

        /// <summary>
        /// 执行查询（SELECT）语句，第一行第一列的值。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="name">存储过程名称/或SQL语句</param>
        /// <param name="Type">类型</param>
        /// <param name="param">参数</param>
        /// <returns>int flag</returns>
        string GetScalar(string name, CommandType Type, params Object[] param);

        /// <summary>
        /// 执行查询（SELECT）语句，获取填充后数据集。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <returns>DataSet</returns>
        DataSet GetDataSet(string sql);

        /// <summary>
        /// 执行查询（SELECT）语句，获取填充后数据集。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="name">存储过程名称/或SQL语句</param>
        /// <param name="Type">类型</param>
        /// <param name="param">参数</param>
        /// <returns>DataSet</returns>
        DataSet GetDataSet(string name, CommandType Type, params Object[] param);
    }

    /// <summary>
    /// DBHelper接口【异步】
    /// </summary>
    public interface IDBHelperAsync
    {
        /// <summary>
        /// 执行增（INSERT）删（DELETE）改（UPDATE）语句。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <returns></returns>
        Task<int> ExecuteCommandAsync(string sql);

        /// <summary>
        /// 执行增（INSERT）删（DELETE）改（UPDATE）语句。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="name">存储过程名称/或SQL语句</param>
        /// <param name="Type">类型</param>
        /// <param name="param">参数</param>
        /// <returns>int flag</returns>
        Task<int> ExecuteCommandAsync(string name, CommandType Type, params Object[] param);

        /// <summary>
        /// 执行查询（SELECT）语句，第一行第一列的值。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <returns>int flag</returns>
        Task<string> GetScalarAsync(string sql);

        /// <summary>
        /// 执行查询（SELECT）语句，第一行第一列的值。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="name">存储过程名称/或SQL语句</param>
        /// <param name="Type">类型</param>
        /// <param name="param">参数</param>
        /// <returns>int flag</returns>
        Task<string> GetScalarAsync(string name, CommandType Type, params Object[] param);

        /// <summary>
        /// 执行查询（SELECT）语句，获取填充后数据集。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="sql">SQL 语句</param>
        /// <returns>DataSet</returns>
        Task<DataSet> GetDataSetAsync(string sql);

        /// <summary>
        /// 执行查询（SELECT）语句，获取填充后数据集。
        /// 这个方法自己会创建连接、打开连接并且自动关闭连接。
        /// </summary>
        /// <param name="name">存储过程名称/或SQL语句</param>
        /// <param name="Type">类型</param>
        /// <param name="param">参数</param>
        /// <returns>DataSet</returns>
        Task<DataSet> GetDataSetAsync(string name, CommandType Type, params Object[] param);
    }
}
